home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / net_src.arc / arpcmd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-08  |  4.4 KB  |  202 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "timer.h"
  5. #include "enet.h"
  6. #include "ax25.h"
  7. #include "arp.h"
  8. #include "cmdparse.h"
  9.  
  10. extern char badhost[];
  11. extern char nospace[];
  12.  
  13. int doarpadd(),doarpdrop();
  14. struct cmds arpcmds[] = {
  15.     "add", doarpadd, 4,
  16.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  17.     "arp add failed",
  18.  
  19.     "drop", doarpdrop, 3,
  20.     "arp drop <hostid> ether|ax25|netrom",
  21.     "not in table",
  22.  
  23.     "publish", doarpadd, 4,
  24.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  25.     "arp add failed",
  26.  
  27.     NULLCHAR, NULLFP, 0,
  28.     "arp subcommands: add, drop, publish",
  29.     NULLCHAR, 
  30. };
  31. char *arptypes[] = {
  32.     "NET/ROM",
  33.     "10 Mb Ethernet",
  34.     "3 Mb Ethernet",
  35.     "AX.25",
  36.     "Pronet",
  37.     "Chaos",
  38.     "Arcnet",
  39.     "Appletalk"
  40. };
  41.  
  42. int
  43. doarp(argc,argv)
  44. int argc;
  45. char *argv[];
  46. {
  47.     if(argc < 2){
  48.         dumparp();
  49.         return 0;
  50.     }
  51.     return subcmd(arpcmds,argc,argv);
  52. }
  53. static
  54. doarpadd(argc,argv)
  55. int argc;
  56. char *argv[];
  57. {
  58.     int16 hwalen,hardware,naddr;
  59.     int32 addr,resolve();
  60.     char *hwaddr;
  61.     struct arp_tab *ap;
  62.     struct arp_type *at;
  63.     void arp_drop();
  64.     int pub = 0;
  65.  
  66.     if(argv[0][0] == 'p')    /* Is this entry published? */
  67.         pub = 1;
  68.     if((addr = resolve(argv[1])) == 0){
  69.         printf(badhost,argv[1]);
  70.         return 1;
  71.     }
  72.     /* This is a kludge. It really ought to be table driven */
  73.     switch(tolower(argv[2][0])){
  74.     case 'n':    /* Net/Rom pseudo-type */
  75.         hardware = ARP_NETROM;
  76.         naddr = argc - 3 ;
  77.         if (naddr != 1) {
  78.             printf("No digipeaters in NET/ROM arp entries - ") ;
  79.             printf("use netrom route add\n") ;
  80.             return 1 ;
  81.         }
  82.         break;
  83.     case 'e':    /* "ether" */
  84.         hardware = ARP_ETHER;
  85.         naddr = 1;
  86.         break;        
  87.     case 'a':    /* "ax25" */
  88.         hardware = ARP_AX25;
  89.         naddr = argc - 3;
  90.         break;
  91.     case 'm':    /* "mac appletalk" */
  92.         hardware = ARP_APPLETALK;
  93.         naddr = 1;
  94.         break;
  95.     default:
  96.         printf("unknown hardware type \"%s\"\n",argv[2]);
  97.         return -1;
  98.     }
  99.     /* If an entry already exists, clear it */
  100.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  101.         arp_drop(ap);
  102.  
  103.     at = &arp_type[hardware];
  104.     if(at->scan == NULLFP){
  105.         printf("Attach device first\n");
  106.         return 1;
  107.     }
  108.     /* Allocate buffer for hardware address and fill with remaining args */
  109.     hwalen = at->hwalen * naddr;
  110.     if((hwaddr = malloc(hwalen)) == NULLCHAR){
  111.         printf(nospace);
  112.         return 0;
  113.     }
  114.     /* Destination address */
  115.     (*at->scan)(hwaddr,&argv[3],argc - 3);
  116.     ap = arp_add(addr,hardware,hwaddr,hwalen,pub);    /* Put in table */
  117.     free(hwaddr);                    /* Clean up */
  118.     stop_timer(&ap->timer);            /* Make entry permanent */
  119.     ap->timer.count = ap->timer.start = 0;
  120.     return 0;
  121. }
  122. /* Remove an ARP entry */
  123. static
  124. doarpdrop(argc,argv)
  125. int argc;
  126. char *argv[];
  127. {
  128.     int16 hardware;
  129.     int32 addr,resolve();
  130.     struct arp_tab *ap;
  131.     void arp_drop();
  132.  
  133.     if((addr = resolve(argv[1])) == 0){
  134.         printf(badhost,argv[1]);
  135.         return 1;
  136.     }
  137.     /* This is a kludge. It really ought to be table driven */
  138.     switch(tolower(argv[2][0])){
  139.     case 'n':
  140.         hardware = ARP_NETROM;
  141.         break;
  142.     case 'e':    /* "ether" */
  143.         hardware = ARP_ETHER;
  144.         break;        
  145.     case 'a':    /* "ax25" */
  146.         hardware = ARP_AX25;
  147.         break;
  148.     case 'm':    /* "mac appletalk" */
  149.         hardware = ARP_APPLETALK;
  150.         break;
  151.     default:
  152.         hardware = 0;
  153.         break;
  154.     }
  155.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  156.         return -1;
  157.     arp_drop(ap);
  158.     return 0;    
  159. }
  160. /* Dump ARP table */
  161. static
  162. dumparp()
  163. {
  164.     register int i;
  165.     extern struct arp_stat arp_stat;
  166.     register struct arp_tab *ap;
  167.     char e[128];
  168.     char *inet_ntoa();
  169.     extern char *arptypes[];
  170.  
  171.     printf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  172.      arp_stat.recv,arp_stat.badtype,arp_stat.badaddr,arp_stat.inreq,
  173.      arp_stat.replies,arp_stat.outreq);
  174.  
  175.     printf("IP addr         Type           Time Q Addr\n");
  176.     for(i=0;i<ARPSIZE;i++){
  177.         for(ap = arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  178.             printf("%-16s",inet_ntoa(ap->ip_addr));
  179.             printf("%-15s",arptypes[ap->hardware]);
  180.             printf("%-5ld",ap->timer.count*(long)MSPTICK/1000);
  181.             if(ap->state == ARP_PENDING)
  182.                 printf("%-2u",len_q(ap->pending));
  183.             else
  184.                 printf("  ");
  185.             if(ap->state == ARP_VALID){
  186.                 if(arp_type[ap->hardware].format != NULLFP){
  187.                     (*arp_type[ap->hardware].format)(e,ap->hw_addr);
  188.                 } else {
  189.                     e[0] = '\0';
  190.                 }
  191.                 printf("%s",e);
  192.             } else {
  193.                 printf("[unknown]");
  194.             }
  195.             if(ap->pub)
  196.                 printf(" (published)");
  197.             printf("\n");
  198.         }
  199.     }
  200.     return 0;
  201. }
  202.